package com.passer.network.wlan;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class WlanUtils {
    // wlan配置文件操作（生成、导出...）路径
    private static final String WLAN_FILE_DIR_PATH = "";

    /**
     * 注：
     *   1、以下netsh wlan系列命令通过 Runtime.exec() 系列方法执行，即在 cmd 执行，故依赖于工作目录，在此项目中即上面的 WLAN_FILE_DIR_PATH。
     *      在下述的编码中，会写死。故在如下的命令中，不需要考虑。目录；
     *   2、之所以如下命令采用“替换合成”，而不是“拼接合成”，是因为：这些命令的格式都是固定的，后续拼接容易错误或遗漏，
     *      而替换容易、保险
     */
    // 列出所有可用wlan
    private static final String CMD_SHOW_WLAN = "netsh wlan show networks mode=bssid";
    // 添加wlan配置文件
    private static final String CMD_ADD_WLAN = "netsh wlan add profile filename=WLAN-ssid_name.xml";
    // 连接wlan，ssid_name是wlan的名称
    private static final String CMD_CONNECT_WLAN = "netsh wlan connect name=ssid_name";
    // 此命令用于确认是否已连上wlan，即是否可上网。因此是间接测试，而不是直接测试。
    private static final String CMD_PING = "ping www.baidu.com";

    /**
     * wlan配置文件模板
     * 注：此项目生成wlan配置文件的方法就是将需要的信息替换到模板的相应位置，仅此而已，而不是通过调用第三方包
     */
    private static final String XML_FORMAT = "<?xml version=\"1.0\"?>"
            + "<WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">"
            + "<name>WIFI_NAME</name>"
            + "<SSIDConfig>"
            + "<SSID>"
            + "<name>WIFI_NAME</name>"
            + "</SSID>"
            + "<nonBroadcast>true</nonBroadcast>"
            + "</SSIDConfig>"
            + "<connectionType>ESS</connectionType>"
            + "<connectionMode>manual</connectionMode>"
            + "<MSM>"
            + "<security>"
            + "<authEncryption>"
            + "<authentication>WPA2PSK</authentication>"
            + "<encryption>AES</encryption>"
            + "<useOneX>false</useOneX>"
            + "</authEncryption>"
            + "<sharedKey>"
            + "<keyType>passPhrase</keyType>"
            + "<protected>false</protected>"
            + "<keyMaterial>PASSWORD</keyMaterial>"
            + "</sharedKey>"
            + "</security>"
            + "</MSM>"
            + "<MacRandomization xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v3\">"
            + "<enableRandomization>false</enableRandomization>"
            + "</MacRandomization>"
            + "</WLANProfile>";

    /**
     * 生成wlan配置文件
     *
     * @param ssidName wlan名称
     */
    private static void generateXml(String ssidName, String password) throws FileNotFoundException {
        try(PrintWriter out = new PrintWriter(new File(WLAN_FILE_DIR_PATH, "WLAN-" + ssidName + ".xml"))) {

            String xmlContent = XML_FORMAT.replaceAll("WIFI_NAME", ssidName).replaceAll("PASSWORD", password);
            out.println(xmlContent);
            out.flush();
        }
    }
}
